﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows;
using BrasilFramework.Controle.WPF.Comum;
using BrasilFramework.Controle.WPF.Comum.Validacao;

namespace BrasilFramework.Controle.WPF
{
    public class ComboBox : System.Windows.Controls.ComboBox
    {
        private readonly ValidatorManager _gerenciadorValidacao = new ValidatorManager();
        private readonly RequiredValidator _validadorObrigatoriedade = new RequiredValidator {IsShowIndicator = false};

        protected override void OnInitialized(EventArgs e)
        {
            base.OnInitialized(e);
            _validadorObrigatoriedade.SetManagerAndControl(_gerenciadorValidacao, this);
            RegistrarValidacao();
        }

        private void RegistrarValidacao()
        {
            if (!IsInitialized) return;

            _validadorObrigatoriedade.Finalizar();

            if (!Obrigatorio) return;
            _validadorObrigatoriedade.DefaultValue = ValorPadrao;
            _validadorObrigatoriedade.ErrorMessage = string.Format(Mensagem.CampoObrigatorio, NomeAmigavel);
            _validadorObrigatoriedade.Inicializar();
        }

        public List<string> Erros()
        {
            var validacao = _gerenciadorValidacao.ValidateAll();
            return validacao.Select(item => item.ErrorMessage).ToList();
        }

        #region Propriedades

        public static readonly DependencyProperty PropriedadeObrigatorio =
            DependencyProperty.Register(
                "Obrigatorio",
                typeof (bool),
                typeof (ComboBox),
                new PropertyMetadata(false, PropriedadeMudou));

        public static readonly DependencyProperty PropriedadeNomeAmigavel =
            DependencyProperty.Register(
                "NomeAmigavel",
                typeof (string),
                typeof (ComboBox),
                new PropertyMetadata(string.Empty, PropriedadeMudou));

        public static readonly DependencyProperty PropriedadeValorPadrao =
            DependencyProperty.Register(
                "ValorPadrao",
                typeof (string),
                typeof (ComboBox),
                new PropertyMetadata(string.Empty, PropriedadeMudou));

        [Description("Obriga o preenchimento do campo."), Category("Validação")]
        public bool Obrigatorio
        {
            get { return (bool) GetValue(PropriedadeObrigatorio); }
            set { SetValue(PropriedadeObrigatorio, value); }
        }

        [Description("Nome amigável para o controle. Este nome será exibido nas mensagens de validação."),
         Category("Validação")]
        public string NomeAmigavel
        {
            get { return (string) GetValue(PropriedadeNomeAmigavel); }
            set { SetValue(PropriedadeNomeAmigavel, value); }
        }

        [Description("Valor padrão que deve ser considerado como não selecionado."),
         Category("Validação")]
        public string ValorPadrao
        {
            get { return (string) GetValue(PropriedadeValorPadrao); }
            set { SetValue(PropriedadeValorPadrao, value); }
        }

        private static void PropriedadeMudou(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            ((ComboBox) sender).RegistrarValidacao();
        }

        #endregion
    }
}